#ifndef __CLX_UTIL_H__
#define __CLX_UTIL_H__

/*  实用工具类实现 ：
    1、 获取系统时间
    2、 判断文件是否存在
    3、 获得文件所在路径
    4、 创建目录
*/

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <ctime>

namespace clxlog{
    namespace util {

        class Data {
            public:
                static size_t now() { return static_cast<size_t>(time(nullptr)); }
        };

        class File {
            public:
                static bool exists(const std::string &pathname) {
                    // 方法1 获取文件状态，若存在则可能获取成功，若不存在则一定失败
                    struct stat st;
                    if (stat(pathname.c_str(), &st) < 0) {
                        return false;
                    }
                    return true;
                    //  方法2 access  是一个系统调用接口，使用后代码移植性不好
                    //  return (access(pathname.c_str(), F_OK) == 0);
                }
                static std::string path(const std::string &pathname) {
                    // ./abc/a.txt
                    size_t pos = pathname.find_last_of("/\\");
                    if (pos == std::string::npos) return ".";
                    return pathname.substr(0, pos + 1);
                }
                static void createDirectory(const std::string& pathname) {
                    // ./abc/a
                    size_t pos = 0, idx = 0;
                    while (idx < pathname.size()) {
                        pos = pathname.find_first_of("/\\", idx);
                        if (pos == std::string::npos) {
                            mkdir(pathname.c_str(), 0777);
                        }

                        std::string parent_dir = pathname.substr(0 , pos + 1);
                        if (!exists(parent_dir.c_str())) {
                            mkdir(parent_dir.c_str() , 0777);
                        } 
                        idx = pos + 1;
                    }
                }
        };
    }
}
#endif